package cn.stuManagement.student;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;

import cn.stum.util.GetCommand;
//

public class Teacher implements ITeacherController {

	// 静态属性
	// 所有学生的信息，不在这里面写了
	// public static List<Student> listStu = new ArrayList<>();
	// 实例化scanner对象，方便方法中的调用
	private static Scanner sc = new Scanner(System.in);
	// 单例模式创建一个老师
	private static Teacher teacher = new Teacher("admin", "123456");

	// 教师用户属性
	private String teacherID;
	private String teacherPW;

	// 获取实例
	public static Teacher getinstance() {
		return teacher;
	}
	
	
	@Override
	public boolean loginTeacher() {
		
		//接收用户名和密码的变量
		String userName;
		String userPW;
		System.out.println("教师登录：");
		//输入用户名和密码
		System.out.println("请输入用户名：");
		userName = sc.next();
		System.out.println("请输入密码：");
		userPW = sc.next();
		
		//判断是否与教师用户名和密码相符
		if(userName.equals(teacherID) ) {
			if (userPW.equals(teacherPW)) {
				//TODO 转入教师界面
				System.out.println("教师登录成功");
				return true;
			}else {
				System.out.println("密码错误");
				return false;
			}
		}else {
			System.out.println("用户名输入错误");
			return false;
		}
		
	}
	
	
	public static Student loginStu(List<Student> list) {
		//返回值
		Student user = new Student();
		//输入用户名
		System.out.println("请输入学生编号:");
		String userID = sc.next();
		System.out.println("请输入学生密码:");
		String userPW = sc.next();
		//用户名和密码构成map进行搜索
		Map<String,Object> mapUser = new HashMap<>();
		mapUser.put("userID", userID);
		List<Student> qList = new ArrayList<>();
		qList = teacher.listCondition(list, mapUser);
		if(qList==null) {
			//返回空
			return null;
			
		}else {
			System.out.println(userID+"登录成功");
			for (Student student : qList) {
				user =student;
			}
			//返回用户
			return user;
		}
		
		
		
		
	}

	@Override
	public  void add(List<Student> list) throws Exception {
		// 待输入的学生人数
		int num = 0;
		// 判断是否需要继续输入
		int isContinue = 1;

		// 如果有输入的人数获取，没有设为0
		System.out.println("请输入要输入的学生人数：");
		if (sc.hasNextInt()) {
			num = sc.nextInt();
		}
		// 每次调用这个方法，让stuIDFlag自增1
		GetCommand.read();
		GetCommand.setMajorNO(GetCommand.getMajorNO() + 1);
		GetCommand.write();

		if (num > 0) {
			for (int i = 0; i < num; i++) {
				// 接收学生对象的变量
				Student user1 = new Student();

				System.out.println("请输入第" + (i + 1) + "个学生信息");
				System.out.println("自动分配学生编号(ID不重复)及密码");
				// 假设一次输入在100人以内，自动分配id
				if (i < 10) {
					user1.setUserID(GetCommand.getMajorNO() + "0" + i);
				} else if (i >= 10 && i < 100) {
					user1.setUserID(GetCommand.getMajorNO() + i + "");
				}
				// 设置初始密码为123456
				user1.setUserPw("123456");
				System.out.println("当前学生的编号为：" + user1.getUserID() + "密码为：" + user1.getUserPw());
				System.out.println("请输入学生姓名");
				user1.setUserName(sc.next());
				System.out.println("请输入学生性别：");
				user1.setUserGender(sc.nextInt());
				System.out.println("请输入学生年龄：");
				user1.setUserAge(sc.nextInt());

				System.out.println("需要继续输入学生电话和家庭地址吗？需要回复1，不需要回复2");
				isContinue = sc.nextInt();
				if (isContinue == 2) {
					// 加入到链表
					list.add(user1);
					continue;
				}
				System.out.println("请输入学生电话");
				user1.setUserTel(sc.next());
				System.out.println("请输入学生家庭地址：");
				user1.setUserAddress(sc.next());
				// 加入到链表
				list.add(user1);

			}
		} else if (num == 0) {
			System.out.println("不需要添加学生信息");
		} else {
			System.out.println("输入有误");
		}
	}

	@Override
	public  void remove(List<Student> list) {
		// 学生对象用于接收返回的学生信息
		Student stuDel = new Student();
		// 提示只删除一个的方式
		System.out.println("如果只删除一个学生信息请选择编号查找");
		// 根据ID查找学生信息
		Map<String, Object> mapStuDel = new HashMap<>();
		mapStuDel = searchCondition();
		// 查找结果存放的列表
		List<Student> qList = new ArrayList<>();
		qList = listCondition(list, mapStuDel);
		// 确认要删除搜索的信息？
		System.out.println("确认要删除一下信息输入y,按其他键返回");
		// 输出查找到的信息
		printList(qList);
		if (sc.next().equals("y")) {
			list.remove(stuDel);
			
		} else {
			return;
		}

	}

	@Override
	public  boolean update(List<Student> list) {
		//定义返回值标志位
		boolean updating = true;
		// 学生对象用于接收返回的学生信息
		Student stuUpdate = new Student();
		// 提示只删除一个的方式
		System.out.println("只能修改一个学生信息，请选择编号查找");
		// 根据ID查找学生信息
		Map<String, Object> mapStuDel = new HashMap<>();
		mapStuDel = searchCondition();
		// 查找结果存放的列表
		List<Student> qList = new ArrayList<>();
		qList = listCondition(list, mapStuDel);
		// 接收字段变量
		String field;
		// 接收字段内容
		String value;

		// 判断查询结果中有几个学生信息，1个可以进行修改，禁止多个
		if (qList.size() == 1) {

			// 输出查找的结果
			printList(qList);
			// 获取学生对象
			for (Student student : qList) {
				stuUpdate = student;
			}
			while(true) {
			// 输出提示信息：要求用户输入字段
			System.out.println("请输入要修改的字段编号：");
			System.out.println("1.编号(禁止修改) 2.姓名 3.性别 4.年龄 5.电话 6.籍贯");
			field = sc.next();
			System.out.println("请输入要修改的内容：");
			value = sc.next();

			switch (field) {
			case "1":
				System.out.println("没有权限修改用户ID");
				updating =false;
				break;
			case "2":
				stuUpdate.setUserName(value);
				updating = true;
				return true;
			case "3":
				stuUpdate.setUserGender(Integer.valueOf(value));
				updating = true;
				break;
			case "4":
				stuUpdate.setUserAge(Integer.valueOf(value));
				updating = true;
				break;
			case "5":
				stuUpdate.setUserTel(value);
				updating = true;
				break;
			case "6":
				stuUpdate.setUserAddress(value);
				updating = true;
				break;

			default:
				System.out.println("字段输入有误，请重新输入");
				updating =false;
				break;
			}
			System.out.println("停止修改输入n");
			if(sc.next().equals("n")) {
				break;
			}
			}

		} else {
			System.out.println("不提供批量修改功能");
			updating =false;
		}
		
		
		return updating;
	}

	public  Map<String, Object> searchCondition() {
		// 创建map存储输入的条件
		Map<String, Object> mapCondition = new HashMap<>();
		// 接收字段变量
		String field;
		// 接收字段内容
		String value;

		// 循环增加条件
		do {
			// 输出提示信息：要求用户输入字段
			System.out.println("请输入带查找的字段编号：");
			System.out.println("1.编号 2.姓名 3.性别 4.年龄 5.电话 6.籍贯");
			field = sc.next();
			System.out.println("请输入要查找的内容：");
			value = sc.next();

			switch (field) {
			case "1":
				mapCondition.put("userID", value);
				break;
			case "2":
				mapCondition.put("userName", value);
				break;
			case "3":
				mapCondition.put("userGender", Integer.valueOf(value));
				break;
			case "4":
				mapCondition.put("userAge", Integer.valueOf(value));
				break;
			case "5":
				mapCondition.put("userTel", value);
				break;
			case "6":
				mapCondition.put("userAddress", value);
				break;

			default:
				System.out.println("字段输入有误，请重新输入");
				break;
			}

			// 提示是否退出
			System.out.println("结束条件输入n,继续输入其他内容");
			if (sc.next().equals("n")) {
				break;
			}

		} while (true);

		if (mapCondition == null || mapCondition.size() == 0) {
			return null;
		} else {
			return mapCondition;
		}
	}

	/**
	 * 暂时不用
	 * 退出方法
	 * @return
	 */
	public static String exit() {
		
		System.out.println("停止输入n，继续输入y");
		String isexit = sc.next();
		return isexit;
	}

	/**
	 * 调用这个方法之前应该提示可查找的字段范围
	 */
	@Override
	public  List<Student> listCondition(List<Student> list, Map<String, Object> condition) {

		System.out.println("按条件查找对应的学生信息：");

		// 创建一个list用来存储查询到的信息
		List<Student> queryList = new ArrayList<>();
		// 遍历学生信息
		for (Student student : list) {
			// 定义标志位
			boolean isMatch = true;

			// 遍历查询信息
			for (Map.Entry<String, Object> map : condition.entrySet()) {
				// 如果某一项名称相符但内容不符，就说明不是要查询的内容
				// 设置标志位为false
				if (map.getKey().equals("userID")) {
					// 编号
					if (!map.getValue().equals(student.getUserID())) {
						isMatch = false;
					}
				} else if (map.getKey().equals("userName")) {
					// 姓名
					if (!map.getValue().equals(student.getUserName())) {
						isMatch = false;
					}
				} else if (map.getKey().equals("userGender")) {
					// 性别
					if (!map.getValue().equals(student.getUserGender())) {
						isMatch = false;
					}
				} else if (map.getKey().equals("userAge")) {
					// 年龄
					if (!map.getValue().equals(student.getUserAge())) {
						isMatch = false;
					}
				} else if (map.getKey().equals("userTel")) {
					// 电话
					if (!map.getValue().equals(student.getUserTel())) {
						isMatch = false;
					}
				} else if (map.getKey().equals("userAddress")) {
					// 地址
					if (!map.getValue().equals(student.getUserAddress())) {
						isMatch = false;
					}
				}

			}
			// 上面代码运行结束判断标志位
			// 如果仍未真
			if (isMatch) {
				queryList.add(student);

			}
		}

		// 返回值
		if (queryList.size() == 0 || queryList == null) {
			return null;
		} else {
			return queryList;
		}
	}

	@SuppressWarnings("unchecked")
	@Override
	public  List<Student> listsALL(File file) {
		List<Student> list = new ArrayList<>();
		FileInputStream fis;
		ObjectInputStream ois;

		try {
			if (!file.exists()) {
				file.createNewFile();
			}

			fis = new FileInputStream(file);
			ois = new ObjectInputStream(fis);
			list = (List<Student>) ois.readObject();

			// 测试的时候输出，运行的时候不输出
			/*
			 * for (Student user : list) { System.out.println(user);
			 * System.out.println(user.getUserID()+'\t'+user.getUserPw()+'\t'
			 * +user.getUserName()+'\t'+user.getUserGender()+'\t'
			 * +user.getUserAge()+'\t'+user.getUserTel()+'\t' +user.getUserAddress()); }
			 */

			if (ois != null) {
				ois.close();
			}
			if (fis != null) {
				fis.close();
			}
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		if (list.size() != 0) {
			return list;
		} else {
			return null;
		}
	}

	@Override
	public  void saveAll(List<Student> list, File file) {

		try {
			if (!file.exists()) {
				file.createNewFile();
			}
			FileOutputStream fos = new FileOutputStream(file);
			ObjectOutputStream oos = new ObjectOutputStream(fos);

			oos.writeObject(list);
			oos.flush();

			if (oos != null) {
				oos.close();
			}
			if (fos != null) {
				fos.close();
			}

		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	public void printList(List<Student> list) {
		// 测试的时候输出，运行的时候不输出
		System.out.println("编号\t密码\t用户名\t性别\t年龄\t家庭电话\t地址\t");
		for (Student user : list) {
			System.out.println(
					user.getUserID() + '\t' + user.getUserPw() + '\t' + user.getUserName() + '\t' + user.getUserGender()
							+ '\t' + user.getUserAge() + '\t' + user.getUserTel() + '\t' + user.getUserAddress());
		}
	}

	/**
	 * @param teacherID
	 * @param teacherPW
	 */
	public Teacher(String teacherID, String teacherPW) {
		super();
		this.teacherID = teacherID;
		this.teacherPW = teacherPW;
	}

	/**
	 * 
	 */
	public Teacher() {
		super();
	}

}
